package com.zsrt.oa.company.service.impl;

import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.zsrt.oa.company.dao.CompanyDao;
import com.zsrt.oa.company.entity.CompanyEntity;
import com.zsrt.oa.company.service.CompanyService;
import com.zsrt.utils.DBUtils;

/**
 * 公司的服务层实现类
 * @author 罗智壕-13424431416
 *
 * 2017年6月19日
 */
public class CompanyServiceImpl implements CompanyService {
	
	static{
		String resource = "mybatisConfig.xml";
		//1 加载 mybatis 的配置文件（它也加载关联的映射文件）
		Reader reader = null;
		try {
			reader = Resources.getResourceAsReader(resource);
		} catch (IOException e) {
			e.printStackTrace();
		}
		//2 构建 sqlSession 的工厂
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
		//3 创建能执行映射文件中 sql 的 sqlSession
		SqlSession session = sessionFactory.openSession(true);
		dao = session.getMapper(CompanyDao.class);
	}
	
	/**
	 * 公司的持久层
	 */
	private static CompanyDao dao;
	
	/**
	 * 修改公司
	 * @param entity	修改后的公司
	 * @param map
	 */
	@Override
	public void updateCompanyMessage(CompanyEntity entity, Map<String, Object> map) {
		if(entity.getId() == null || "".equals(entity.getId())){
			map.put("result", "failure");
			map.put("message", "需要修改的id不能是空...");
			return;
		}
		boolean checkAdd = checkAdd(entity, map);
		if(checkAdd){
			try {
				//调用持久层增加的方法
				int result = dao.updateCompanyMessage(entity);
				if(result == 1){
					map.put("result", "success");
					map.put("message", "修改成功...");
				}else{
					map.put("result", "failure");
					map.put("message", "修改失败...");
				}
			} catch (SQLException e) {
				map.put("result", "error");
				map.put("message", "服务器出现异常，程序员正在拼命抢修...");
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 指定查询
	 * @param entity	需要查询的公司
	 * @param map
	 */
	@Override
	public void findById(String id, Map<String, Object> map) {
		if(id == null || "".equals(id)){
			map.put("result", "failure");
			map.put("message", "查询不能是空...");
			return;
		}
		try {
			 CompanyEntity entity = dao.findById(Integer.parseInt(id));
			 map.put("result", "success");
			 map.put("message", "查询成功..");
			 map.put("data", entity);
		} catch (SQLException e) {
			map.put("result", "error");
			map.put("message", "服务器出现异常，程序员正在拼命抢修...");
			e.printStackTrace();
		}
	}
	
	/**
	 * 批量删除公司
	 * @param proIds	需要删除公司的集合
	 * @param map
	 */
	@Override
	public void batchDeleteIds(String proIds, Map<String, Object> map) {
		if(proIds == null || "".equals(proIds)){
			map.put("result", "failure");
			map.put("message", "删除不能是空...");
			return;
		}
		
		String[] split = proIds.split(",");
		boolean checkResult = true;
		for(int index=0; index<split.length; index++){
			checkResult = DBUtils.checkNumber(split[index]);
		}
		
		if(checkResult){
			try {
				int result = dao.batchDeleteIds(split);
				if(result >= 1){
					map.put("result", "success");
					map.put("message", "删除成功..");
				}
			} catch (SQLException e) {
				map.put("result", "error");
				map.put("message", "服务器出现异常，程序员正在拼命抢修...");
				e.printStackTrace();
			}
		}else{
			map.put("result", "failure");
			map.put("message", "删除必须是数字..");
		}
	}
	
	/**
	 * 公司增加
	 * @param entity 需要增加的公司对象
	 * @param map 	   返回到前台的map
	 */
	@Override
	public void add(CompanyEntity entity, Map<String, Object> map) {
		boolean checkAdd = checkAdd(entity, map);
		if(checkAdd){
			try {
				//调用持久层增加的方法
				int result = dao.add(entity);
				if(result == 1){
					map.put("result", "success");
					map.put("message", "增加成功...");
				}else{
					map.put("result", "failure");
					map.put("message", "增加失败...");
				}
			} catch (SQLException e) {
				map.put("result", "error");
				map.put("message", "服务器出现异常，程序员正在拼命抢修...");
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 公司增加的校验
	 * @param entity 需要校验的对象
	 * @param map	 返回到前台的map
	 */
	public boolean checkAdd(CompanyEntity entity,Map<String, Object> map){
		
		//公司电话校验
		String tel = entity.getCompanyTel();
		if(null == tel || "".equals(tel)){
			map.put("result", "failure");
			map.put("message", "电话不能为空...");
		}else{
			boolean resultTel = DBUtils.isInteger(tel);
			if(!resultTel){
				map.put("result", "failure");
				map.put("message", "电话必须是数字...");
			}
		}
		
		//公司负责人校验
		String cn = entity.getCompanyManager();
		if(null == cn || "".equals(cn)){
			map.put("result", "failure");
			map.put("message", "公司负责人不能为空...");
		}else{
			boolean cnResult = DBUtils.checkName(cn);
			if(!cnResult){
				map.put("result", "failure");
				map.put("message", "公司负责人必须是2~4位中文");
			}
		}
		
		return true;
	}
	
	/**
	 * 查询全部公司
	 * @param map
	 */
	@Override
	public void findAll(Map<String, Object> map) {
		try {
			List<CompanyEntity> list = dao.findAll();
			map.put("result", "success");
			map.put("message", "查询成功...");
			map.put("data", list);
		} catch (SQLException e) {
			map.put("result", "error");
			map.put("message", "服务器出现异常，程序员正在拼命抢修...");
			e.printStackTrace();
		}
	}
}
